<html>
<body>
Reports <a href="https://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html">double-checked locking</a>.
<p>
  Double-checked locking tries to initialize a field on demand and in a thread-safe manner, while avoiding the cost of synchronization.
  Unfortunately it is not thread-safe when used on a field that is not declared <code>volatile</code>.
  When using Java 1.4 or earlier, double-checked locking doesn't work even with a <code>volatile</code> field.
  Read the article linked above for a detailed explanation of the problem.
</p>
<p>Example of incorrect double-checked locking:</p>
<pre><code>
  class Foo {
    private Helper helper = null;
    public Helper getHelper() {
      if (helper == null)
        synchronized(this) {
          if (helper == null) helper = new Helper();
        }
        return helper;
      }
    }
    // other functions and members...
  }
</code></pre>
<!-- tooltip end -->
</body>
</html>